package com.yellowcong.test;

import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtField;
import javassist.CtMethod;
import javassist.CtNewMethod;

/**
*
*作者:yellowcong
*日期:2017/08/31
*時間:11:48:36
*描述:
*/
public class Demo7 {
	
	public static void main(String[] args) throws Exception {
		
		ClassPool pool = ClassPool.getDefault();
		
		CtClass cls = pool.get("com.yellowcong.test.TestDemo");
		
		//获取到所有的字段
		CtField [] fields = cls.getFields();
		
		for(CtField field:fields) {
			System.out.println(field.getName());
		}
		
		//对于String类型，CtClass中，没有这个数据类型，只有基本的8中数据类型
		CtMethod method = cls.getDeclaredMethod("say",new CtClass[] {pool.get("java.lang.String")});
		
		//复制方法
		CtMethod newMethod = CtNewMethod.copy(method, cls, null);
		
		//修改原来方法的名称
		String methodName = method.getName()+"$Impl" ;
		method.setName(methodName);
		
		
		//这个 inertBefore方法没有问题
		// method.insertBefore("System.out.println($1);say($$);System.out.println(\"start!!!\");"); 
		
		//insertAfter方法有问题
		//method.insertAfter("System.out.println(\"end!!!\");");
		
		//修改方法体
		//method.setBody("System.out.println(\"你没机会了\");");
		
		// 修改原方法  
		newMethod.setBody("{System.out.println(\"执行前\");" + methodName + "($$);System.out.println(\"执行后\");}");
	    cls.addMethod(newMethod);
	    
		Class me = cls.toClass();
		Object obj = me.newInstance();
		me.getDeclaredMethod("say", String.class).invoke(obj, "test");
		
	}
}

